﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace VideoLink.Streams
{
    /// <summary>
    /// Контрол, к которому применены специальные стили для того,
    /// чтобы отрисовка происходила быстро и без мерцаний
    /// </summary>
    public partial class Canvas : UserControl
    {
        #region Private fields
		
        /// <summary>
        /// Картинка, которая отображается на контроле сейчас
        /// </summary>
        private Bitmap imageToDraw;
        /// <summary>
        /// Показывает, нужно ли масштабировать картинку, 
        /// чтобы она заполняла максимальное пространство
        /// </summary>
        private bool needStretch = true; 

	    #endregion

        #region Public properties

        /// <summary>
        /// Картинка, которая отображается на контроле сейчас
        /// </summary>
        public Bitmap ImageToDraw
        {
            get
            {
                return imageToDraw;
            }
            set
            {
                imageToDraw = value;
                Refresh();
            }
        }
        /// <summary>
        /// Показывает, нужно ли масштабировать картинку, 
        /// чтобы она заполняла максимальное пространство
        /// </summary>
        public bool NeedScale
        {
            get
            {
                return needStretch;
            }
            set
            {
                needStretch = value;
                Refresh();
            }
        }
        
        #endregion

        /// <summary>
        /// Создать новый экземпляр класса по умолчанию
        /// </summary>
        public Canvas()
        {
            InitializeComponent();
            SetStyle(ControlStyles.UserPaint
                    | ControlStyles.AllPaintingInWmPaint
                    | ControlStyles.OptimizedDoubleBuffer
                    | ControlStyles.ResizeRedraw,
                true);
        }

        /// <summary>
        /// Вызывается при необходимости перерисовать контрол
        /// </summary>
        /// <param name="sender">-</param>
        /// <param name="e">-</param>
        private void Canvas_Paint(object sender, PaintEventArgs e)
        {
            if (ImageToDraw == null)
                return;

            int width = ImageToDraw.Width;
            int height = ImageToDraw.Height;

            if (NeedScale)
            {
                if (ImageToDraw.Width > ImageToDraw.Height)
                {
                    width = Width;
                    height = (int)(ImageToDraw.Height * Width / (float)ImageToDraw.Width);
                }
                else
                {
                    height = Height;
                    width = (int)(ImageToDraw.Width * Height / (float)ImageToDraw.Height);
                }
            }

            e.Graphics.DrawImage(ImageToDraw,
                0,
                0,
                width,
                height);
        }
    }
}
